//
//  CZHomeListModel.swift
//  微博
//
//  Created by 霸气的刘吉庆 on 16/4/20.
//  Copyright © 2016年 ios. All rights reserved.
//

import UIKit
import SDWebImage
class CZHomeListModel: NSObject {
    

    
//    var statusArray: [CZStutsModel]?
    var statusArray: [CZStatusViewModel]?
    
    
    
    //传入一个block的进行刷新主界面
    //上拉加载刷新的功能,有一个refreshControl,bool值来判断他时候在刷新
    func loadData(isPullup: Bool , finished:(isSuccess: Bool)->()){
        
        
        //urlString
        
        let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
        
        //加载数据,传入参数max_id
        //定义属性max_id
        var max_id: Int64 = 0
        //默认值是0
        var since_id: Int64 = 0
        
        //进行判断
        
        if isPullup {
            //代表的是上拉加载,让这个max_id-1 ,防止重复,文档里面有写就是往下走,数字越小,小于或者等于max_id,所以需要及时的刷新一下.
            
            //取到最后一个元素的id
            max_id = statusArray?.last?.status?.id ?? 0
            
            //取出重复
            
            //判断是否为0,不为0就去重复
            if max_id != 0{
            
                max_id--
            }
            
            
        }else{
            
            //isPullup代表的是上拉加载,传递的参数是since_id
            since_id = statusArray?.first?.status?.id ?? 0
            
            
            
            
            
        }
        
        
        
        //创建参数ccess_token 	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
        
//        let x = max_id
        
        //这里的max_id可以直接写么,这里面的属性是anyobject 是对象,所以属性不行
        let paras = ["access_token": CZUserAccountViewModel.sharedViewModel.accessToken ?? "",
        "max_id": "\(max_id)",
            "since_id":"\(since_id)"
        ]
        
        
        //获取netWorkTools
        
        CZNewWorkTools.sharedTools.request(urlString: urlString, paramenters: paras) { (responseObject, error) -> () in
            
            
            //进行判断
            
            if error != nil {
                
                return
                
                
                
            }
            
//            print(responseObject)
            
            //使用guard来判断返回的是否是字典
            
            guard let dict = responseObject as? [String: AnyObject] else{
                print("数据不是字典")
                
                finished(isSuccess: false)
                return
                
            }
            
            
            //判断上面的字典里面的是否是一个字典的数组
            guard let dictModel = dict["statuses"] as? [[String:AnyObject]] else{
                
                finished(isSuccess: false)
                
                
                return
                
            }
            
            //定义一个临时的数组
            
            var tempArray = [CZStatusViewModel]()
            
            //遍历dictModel进行字典转模型
            
            for value in dictModel {
                
                //进行数据转模型
                
                //注意这里的value是一个字典
                
                let model = CZStutsModel(dict: value)
                
                let viewModel = CZStatusViewModel()
                
                viewModel.status = model
                
                //添加模型
                
                tempArray.append(viewModel)
                
                
                
                
                
                
            }
            
            //赋值给当前的数组
            
            if self.statusArray == nil {
                
                self.statusArray = [CZStatusViewModel]()
                
                
            }
            //判断是否是上拉加载
            
            if isPullup{
                
                
                self.statusArray = self.statusArray! + tempArray
            }else{
                
                //这个代表上拉刷新
                self.statusArray = tempArray + self.statusArray!
            }
            
            
            //回调闭包
            
//            finished(isSuccess: true)
            
//            self.tableView.reloadData()
            
            
            self.cachSingleImage(tempArray, finished: finished)
            
            
            
        }
        
//CZStatusViewModel
    
    
    }
    //缓存单张图片,
    //array本次加载回来的图片
    //这个主要思路是什么呢,主要思路是首先第一个使用group将所有的单张图片加载完成再去刷新,其次
    //其次,什么问题 ,他每次加载的数据是对应的椅子model,因为他每次读取数据的时候,读取一组,所以我们要一组一组的进行设置
    private func cachSingleImage(array: [CZStatusViewModel],finished:(isSuccess: Bool)->()){
        //创建组
        let group = dispatch_group_create()
        //遍历数组
        for value in array {
            
            //遍历判断该图片是否是单张
            //首先转发微博有图片,那么转发的原文不能有图片,
            //如果原文你有图片,那么转发微博就不能有图片
            let original_urls = value.status?.pic_urls
            let retweet_urls = value.status?.retweeted_status?.pic_urls
            
            //取到图片的数组
            //这里没提示我们需要强转,还是需要我们可选么?
            let urls = (original_urls == nil || original_urls?.count == 0) ? retweet_urls : original_urls
            
            //判断图片的count是否等于1
            
            if urls?.count == 1 {
                //取到下载的地址,这里面只有一个属性
                let urlString = urls?.first?.thumbnail_pic
                //向组中添加任务
                dispatch_group_enter(group)
                //2.去下载图片
                //注意这里的urlString是可选值,需要空合并
                SDWebImageManager.sharedManager().downloadImageWithURL(NSURL(string: urlString ?? ""), options: [], progress: nil, completed: { (image, error, _, _, _) -> Void in
                    
                    //完成下载之后,干些什么呢
                    //下载完成,更新数据中的单张图片的imageSize大小
                    value.upDateSingleImagePictureView()
                    //下载完成之后从组中移除
                    dispatch_group_leave(group)
                    
                })
                
            }

        }
        
        //这里监听组里面的任务全部完成之后执行的方法
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            //回调主界面,进行刷新
            finished(isSuccess: true)
            
        }

    }
    
    
    
    

}
